shiro学习

学习原因

  1.我不会,所以要学习啊。
  2.这边我需要用它来完成登录安全认证。

shiro 概念

  Subject:用户。
  SecurityManager:安全管理器;即所有与安全有关的操作都会与SecurityManager交互;且它管理着所有Subject;可以看出它是Shiro的核心,它负责与后边介绍的其他组件进行交互,如果学习过SpringMVC,你可以把它看成DispatcherServlet前端控制器;
  Authenticator:认证器。
  Authorizer:授权器。
  Realm:域,,Shiro从从Realm获取安全数据(如用户、角色、权限),就是说SecurityManager要验证用户身份,那么它需要从Realm获取相应的用户进行比较以确定用户身份是否合法;也需要从Realm得到用户相应的角色/权限进行验证用户是否能进行操作;可以把Realm看成DataSource,即安全数据
  sessionmanager:会话管理器。
  sessionDAO:session数据访问对象。
  cacheManager:缓存控制器,可以和redis集成。 

身份认证流程如下:

  代码如下:

    public class ShiroTest {
        @Test
        public void test() {
            Factory factory = new IniSecurityManagerFactory("classpath:shiro.ini");
            // 2、得到SecurityManager实例 并绑定给SecurityUtils
            SecurityManager securityManager = factory.getInstance();
            SecurityUtils.setSecurityManager(securityManager);
            // 3、得到Subject及创建用户名/密码身份验证Token(即用户身份/凭证)
            Subject subject = SecurityUtils.getSubject();
            UsernamePasswordToken token = new UsernamePasswordToken("zhang", "123");
            try {
                // 4、登录,即身份验证
                subject.login(token);
                System.out.println("222");
            } catch (AuthenticationException e) {
                System.out.println("111");
            }
            Assert.assertEquals(true, subject.isAuthenticated()); // 断言用户已经登录
            // 6、退出
            subject.logout();
        }

    }


    声明一个realm  
    myRealm1=com.github.zhangkaitao.shiro.chapter2.realm.MyRealm1  
    myRealm2=com.github.zhangkaitao.shiro.chapter2.realm.MyRealm2  
    指定securityManager的realms实现  
    securityManager.realms=$myRealm1,$myRealm2 
    public class MyRealm1 implements Realm {  
        @Override  
        public String getName() {  
            return "myrealm1";  
        }  
        @Override  
        public boolean supports(AuthenticationToken token) {  
            //仅支持UsernamePasswordToken类型的Token  
            return token instanceof UsernamePasswordToken;   
        }  
        @Override  
        public AuthenticationInfo getAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {  
            String username = (String)token.getPrincipal();  //得到用户名  
            String password = new String((char[])token.getCredentials()); //得到密码  
            if(!"zhang".equals(username)) {  
                throw new UnknownAccountException(); //如果用户名错误  
            }  
            if(!"123".equals(password)) {  
                throw new IncorrectCredentialsException(); //如果密码错误  
            }  
            //如果身份认证验证成功,返回一个AuthenticationInfo实现;  
            return new SimpleAuthenticationInfo(username, password, getName());  
        }  
    }   

  首先调用Subject.login(token)进行登录,其会自动委托给Security Manager,调用之前必须通过SecurityUtils. setSecurityManager()设置;
  SecurityManager负责真正的身份验证逻辑;它会委托给Authenticator进行身份验证;
  Authenticator才是真正的身份验证者,Shiro API中核心的身份认证入口点,此处可以自定义插入自己的实现;
  Authenticator可能会委托给相应的AuthenticationStrategy进行多Realm身份验证,默认ModularRealmAuthenticator会调用AuthenticationStrategy进行多Realm身份验证;
  Authenticator会把相应的token传入Realm,从Realm获取身份验证信息,如果没有返回/抛出异常表示身份验证失败了。此处可以配置多个Realm,将按照相应的顺序及策略进行访问。

授权管理

  主体,即访问应用的用户,在Shiro中使用Subject代表该用户。用户只有授权后才允许访问相应的资源。
  资源,在应用中用户可以访问的任何东西,比如访问JSP页面、查看/编辑某些数据、访问某个业务方法、打印文本等等都是资源。用户只要授权后才能访问。
  权限,安全策略中的原子授权单位,通过权限我们可以表示在应用中用户有没有操作某个资源的权力。即权限表示在应用中用户能不能访问某个资源,如:访问用户列表页面,查看/新增/修改/删除用户数据(即很多时候都是CRUD(增查改删)式权限控制),打印文档等等。。
  角色代表了操作集合,可以理解为权限的集合,一般情况下我们会赋予用户角色而不是权限,即这样用户可以拥有一组权限,赋予权限时比较方便。典型的如:项目经理、技术总监、CTO、开发工程师等都是角色,不同的角色拥有一组不同的权限。
  权限的话,可以有单个资源的权限的crud,也可以使是单个实例的crud哦。

自身项目如何用的shiro

  项目是基于ssm的框架。
  首先在web.xml上配置shiro拦截器。DelegatingFilterProxy作用是自动到spring容器查找名字为shiroFilter(filter-name) 的bean并把 所有Filter的操作委托给它。然后将ShiroFilter配置到spring容器即可

shiroFilter
org.springframework.web.filter.DelegatingFilterProxy
true

targetFilterLifecycle
true